package com.fjwt.gz.proxy.ctrl.agent;

import cn.hutool.json.JSONUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.fjwt.gz.core.model.ApiRes;
import com.fjwt.gz.db.dto.AgentInfoDTO;
import com.fjwt.gz.db.entity.AgentInfoEntity;
import com.fjwt.gz.db.vo.AgentInfoVO;
import com.fjwt.gz.proxy.ctrl.CommonCtrl;
import com.fjwt.gz.service.impl.AgentInfoService;
import com.fjwt.gz.util.JsonUtils;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author yd
 * @version 1.0
 * @date 2022/8/27 13:50
 */
@Slf4j
@RestController
@RequestMapping("/api/agentInfo")
public class AgentInfoController extends CommonCtrl {
    @Autowired
    private AgentInfoService agentInfoService;

    /**
     * 机构列表
     * @return
     */
    @PreAuthorize("hasAnyAuthority('ENT_PROXY_INFO')")
    @GetMapping(value = "")
    public ApiRes list() {
        AgentInfoDTO agentInfoDTO = getObject(AgentInfoDTO.class);
        log.info("机构端机构列表，请求地址：/api/agentInfo，请求参数：{}", JSONUtil.toJsonStr(agentInfoDTO));
        String currentAgentNo = getCurrentAgentNo();
        IPage<AgentInfoVO> page = agentInfoService.page(getIPage(), agentInfoDTO,currentAgentNo);
        log.info("机构端机构列表，请求地址：/api/agentInfo，返回参数：{}", JSONUtil.toJsonStr(page));
        return ApiRes.page(page);
    }

    /**
     * PC机构端自动新增管理员用户
     * @return
     */
    @PostMapping(value = "/autoAddUser")
    public ApiRes autoAddUser(){
        String agentNo = getValString("agentNo");
        log.info("机构端自动新增管理员用户接口，请求地址：/api/agentInfo/autoAddUser，请求参数：{}", agentNo);
        agentInfoService.autoAddUser(agentNo);
        return ApiRes.ok();
    }

    /**
     * 机构机构端重置密码
     * @return
     */
    @PostMapping(value = "/pwdReset")
    public ApiRes pwdReset(){
        String agentNo = getValString("agentNo");
        log.info("机构端重置密码接口，请求地址：/api/agentInfo/pwdReset，请求参数：{}", agentNo);
        agentInfoService.pwdReset(agentNo);
        return ApiRes.ok();
    }

    /**
     * 机构修改机构信息
     * @return
     */
    @PostMapping(value = "/updateInfo")
    public ApiRes updateInfo(){
        AgentInfoDTO agentInfoDTO = getObject(AgentInfoDTO.class);
        checkAgentAuth(getCurrentAgentNo(), agentInfoDTO.getAgentNo());
        log.info("机构端修改机构信息，请求地址：/api/agentInfo/updateInfo，请求参数：{}", JsonUtils.toJson(agentInfoDTO));
        agentInfoService.updateInfo(agentInfoDTO);
        return ApiRes.ok();
    }

    /**
     * 导出机构列表
     * @return
     */
    @PostMapping(value = "/export")
    public ApiRes export(HttpServletResponse response) {
        AgentInfoDTO agentInfoDTO = getObject(AgentInfoDTO.class);
        checkAgentAuth(getCurrentAgentNo(), agentInfoDTO.getAgentNo());
        log.info("机构端机构列表，请求地址：/api/agentInfo，请求参数：{}", JSONUtil.toJsonStr(agentInfoDTO));
        String currentAgentNo = getCurrentUser().getSysUser().getBelongInfoId();
        AgentInfoDTO vo = new AgentInfoDTO();
        BeanUtils.copyProperties(agentInfoDTO, vo);
        IPage<AgentInfoVO> page = agentInfoService.page(new Page(0, -1), vo,currentAgentNo);
        log.info("机构端机构列表，请求地址：/api/agentInfo，返回参数：{}", JSONUtil.toJsonStr(page));
        //导出数据
        return ApiRes.ok(agentInfoService.export(page,response));
    }

    /**
     * 机构查看机构信息
     * @return
     */
//    @PreAuthorize("hasAnyAuthority('ENT_PROXY_INFO_VIEW')")
    @GetMapping(value = "/detail")
    public ApiRes detail(){
        String agentNo = getValString("agentNo");
        checkAgentAuth(getCurrentAgentNo(), agentNo);
        log.info("机构端查看机构信息，请求地址：/api/agentInfo/detail，请求参数：{}", agentNo);
        AgentInfoEntity agentInfo = agentInfoService.getAgentInfo(agentNo);
        AgentInfoEntity data = new AgentInfoEntity();
        BeanUtils.copyProperties(agentInfo, data);
        return ApiRes.ok(data);
    }
}
